package leetcode.hot100;

/**
 * leetcode-hot100: 环形链表II
 * 测试链接: https://leetcode.cn/problems/linked-list-cycle-ii/?envType=study-plan-v2&envId=top-100-liked
 *
 * 给定一个链表的头节点  head ，返回链表开始入环的第一个节点。 如果链表无环，则返回 null
 */
public class LinkedListCycleII {

    public ListNode detectCycle(ListNode head) {
        if(head==null || head.next==null || head.next.next==null){
            return null;
        }
        //定义快慢指针
        ListNode fast = head.next.next;
        ListNode slow = head.next;
        //让快指针第一次追上慢指针
        while(fast != slow){
            if(fast.next==null || fast.next.next == null){
                return null;
            }
            fast = fast.next.next;
            slow = slow.next;
        }
        //快指针回到头节点位置
        fast = head;
        //之后两个指针都一次走一步，再次相遇的节点就是入环的第一个节点
        while(fast != slow){
            fast = fast.next;
            slow = slow.next;
        }
        return fast;
    }
}
